// pages/provincesServer/index.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    value:'',
    provinces:[],
    initials:[],
    scrollTop: 0,//滚动锚点
    scrollIntoView: '',
    currentLocation:null//定位
  },
  // 点击字母索引
  
  //搜索框取消功能
  onCancel(){
    this.setData({
      value:''
    })
  },
  //搜索框搜索功能 
  async onSearch(ev){
    console.log(ev);
    const keyword = ev.detail
    const _ = getApp().db.command

    let query;

    // 判断是否为大写字母查询（A-Z）
    if (/^[A-Z]$/.test(keyword)) {
      // 仅匹配首字母
      query = { initial: _.eq(keyword) };
    } else {
      // 普通搜索（中文/拼音）
      query = _.or([
        { name: getApp().db.RegExp({ regexp: keyword, options: 'i' }) },
        { pinyin: getApp().db.RegExp({ regexp: keyword, options: 'i' }) }
      ]);
    }
    // 1. 先保存当前滚动位置
    const currentScrollTop = this.data.scrollTop || 0;
    // 2. 执行查询
    let res = await getApp().db.collection('provinces').where(query).get()
    console.log(res);
    if (res.data.length > 0) {
      wx.createSelectorQuery()
      .select(`#anchor-${res.data[0].anchorId}`)
      .boundingClientRect(rect => {
        if (rect) {
          // 4. 精准滚动到搜索结果（保持平滑过渡）
          this.setData({
            searchResults: res.data,
            scrollTop: currentScrollTop + rect.top
          });
        }
      })
      .exec();
      console.log('将要滚动到:', `anchor-${res.data[0].anchorId}`)
      console.log('对应元素:', wx.createSelectorQuery().select(`#anchor-${res.data[0].anchorId}`))
    }
  },
  //获取云数据库中的省份数据
  async localProvinces(){
    //获取值
    const MAX_LIMIT = 20 // 每次查询20条（云开发默认最大值）
    const countResult = await getApp().db.collection('provinces').count()
    const total = countResult.total // 数据库总条数
    const batchTimes = Math.ceil(total / MAX_LIMIT) // 需要分批查询的次数

    let allProvinces = []
    // let res = await getApp().db.collection('provinces').orderBy('initial','asc').orderBy('pinyin','asc').limit(100).get()
    // console.log(res);
    // console.log(res.data);

    for (let i = 0; i < batchTimes; i++) {
      const res = await getApp().db.collection('provinces')
        .skip(i * MAX_LIMIT)
        .limit(MAX_LIMIT)
        .orderBy('initial', 'asc')
        .orderBy('pinyin', 'asc')
        .get()
      allProvinces = allProvinces.concat(res.data)
    }
    const provincesMap = {}
    const initials = []

    allProvinces.forEach(item => {
      const initial = item.initial
      console.log(initial);
      if(!provincesMap[initial]){
        provincesMap[initial] = []
        initials.push(initial)
      }
      // provincesMap[initial].push(item)

      const etcList = item.etc.split('，').map(etc => etc.trim())
      provincesMap[initial].push({
        ...item,
        etcList:etcList
      })
    })
    this.setData({
      initials,
      provinces:provincesMap
    })
  },
  //定位
  getCurrentLocation(){
    this.setData({ locationLoading: true, locationError: false })

    wx.getLocation({
      type:'gcj02',
      success:(res) => {
        console.log('获取定位成功',res);
        this.reverseGeocode(res.latitude,res.longitude)//wx方法拿到的经纬度传给逆地理编码函数
      },
      fail:(err) => {
        console.warn('获取定位失败',err);
        this.setData({
          locationLoading: false,
          locationError: true,
          errorMessage: this.getErrorMessage(err),
          currentLocation:{name:'定位服务未开启'}
        })
      }
    })
  },
  //逆地理编码
  async reverseGeocode(lat,lng){
    //显示加载状态
    this.setData({ locationLoading: true, locationError: false })
    try {
      //调用云函数
      const res = await wx.cloud.callFunction({
        name:'reverseGeocode',
        data:{lat,lng},
        config:{
          env:'cloud1-3gwi5oxf15a2f7e4'
        }
      })

      //处理返回结果
      if(res.result.errCode === 0){
        this.setData({
          currentLocation:{
            name:res.result.data.province,
            detail:res.result.data
          }
        })
      }else{
        throw new Error(res.result.errMsg || '逆地理编码失败')
      }
    } catch (error) {
      console.error('定位失败',error);
      this.setData({
        currentLocation: { name: '获取位置失败' },
        locationError:true,
        errorMessage:this.getErrorMessage(error)
      })
      
    }finally{
      this.setData({
        locationLoading:false
      })
    }
    
  },
  // 错误信息映射
  getErrorMessage(error) {
    const msg = (error && (error.message || error.errMsg)) || ''
  
  // 安全地检查错误信息内容
  if (typeof msg === 'string' && msg.includes('timeout')) {
    return '请求超时，请重试'
  }
  if (typeof msg === 'string' && msg.includes('auth denied')) {
    return '请授权位置权限'
  }
  if (typeof msg === 'string' && msg.includes('fail auth deny')) {
    return '位置权限被拒绝'
  }
  return '获取位置信息失败'
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    this.localProvinces(),
    this.getCurrentLocation()
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})